﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Data.SqlClient;

namespace MikroTransfer
{
    public partial class frmMikroEvrakBirlestir : XtraForm
    {
        Mikro mikro = new Mikro(Db.Kontur);

        public frmMikroEvrakBirlestir()
        {
            InitializeComponent();
        }

        private void frmMikroEvrakBirlestir_Load(object sender, EventArgs e)
        {

        }



        private void simpleButton1_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(dteBasTarih.Text) && !string.IsNullOrEmpty(dteBitTarihi.Text) && !string.IsNullOrEmpty(dteBelgeTarihi.Text) && !string.IsNullOrEmpty(txtEvrakSeri.Text) && !string.IsNullOrEmpty(txtFiltreSeri.Text))
            {
                FaturaOlustur();
            }
            else
            {
                MessageBox.Show("Lütfen Bilgileri Eksiksiz Giriniz !");
            }
        }

        private void FaturaSil(SqlTransaction trn)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(" DELETE ");
            sb.Append(" FROM         CARI_HESAP_HAREKETLERI ");
            sb.Append(" WHERE     (cha_evrakno_seri = @seri) AND (cha_evrak_tip = 63) AND (cha_tarihi >= @tarih1 AND cha_tarihi <= @tarih2) ;");
            sb.Append(" DELETE ");
            sb.Append(" FROM         STOK_HAREKETLERI ");
            sb.Append(" WHERE     (sth_evrakno_seri = @seri) AND (sth_evraktip = 4) AND (sth_tarih >= @tarih1 AND sth_tarih <= @tarih2) ;");
            using (Query q = new Query())
            {
                q.TransAction = trn;
                q.Add(sb.ToString());
                q.Add("@seri", SqlDbType.VarChar, txtFiltreSeri.Text);
                q.Add("@tarih1", SqlDbType.DateTime, dteBasTarih.DateTime);
                q.Add("@tarih2", SqlDbType.DateTime, dteBitTarihi.DateTime);
                q.Exec();
            }
        }


        private void FaturaOlustur()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("SELECT ch.cha_ciro_cari_kodu AS cariKod, st.sth_stok_kod AS stokKod, SUM(st.sth_miktar) AS miktar,SUM(st.sth_tutar) AS tutar, st.sth_vergi_pntr AS vergiSira,dbo.fn_VergiYuzde(st.sth_vergi_pntr) as vergiOran, SUM(st.sth_vergi) AS vergiTutar ");
            sb.Append(" FROM         CARI_HESAP_HAREKETLERI as ch INNER JOIN STOK_HAREKETLERI as st ON ch.cha_RECno = st.sth_fat_recid_recno AND ch.cha_RECid_DBCno = st.sth_fat_recid_dbcno ");
            sb.Append(" WHERE     (ch.cha_evrakno_seri = @seri) AND (ch.cha_evrak_tip = 63) AND (ch.cha_tarihi >= @tarih1 AND ch.cha_tarihi <= @tarih2) ");
            sb.Append(" GROUP BY ch.cha_ciro_cari_kodu, st.sth_vergi_pntr, st.sth_stok_kod ");
            using (Query q = new Query())
            {
                q.Add(sb.ToString());
                q.Add("@seri", SqlDbType.VarChar, txtFiltreSeri.Text);
                q.Add("@tarih1", SqlDbType.DateTime, dteBasTarih.DateTime);
                q.Add("@tarih2", SqlDbType.DateTime, dteBitTarihi.DateTime);
                var sonuc = q.ToList(new { cari = "", stok = "", miktar = 0d, tutar = 0d, kdvsira = 0, kdvOran = 0d, kdvtutar = 0d });

                double aratoplam = 0;
                double meblag = 0;
                int depoNo = Cevir.Parse<int>(Program.Session[Settings.WebDepoKodu]);
                string kasaKodu = Program.Session[Settings.WebNakitKasaKodu].ToString();
                Dictionary<int, int> kdvlist = mikro.KdvList();
                decimal[] vergiTutarlari;

                string evrakSeri = txtEvrakSeri.Text;
                int evrakSira;
                int evrakSatir;
                int CharId;

                DbSqlServer _dbsql = new DbSqlServer();
                SqlTransaction trn = _dbsql.OpenTransaction();

                var cari = (from c in sonuc group c by c.cari into g select g.Key).ToList();
                foreach (var c in cari)
                {
                    evrakSira = mikro.MaxEvrakNo(EvrakTipleri.SatisFaturasi, evrakSeri, trn);
                    evrakSatir = 0;
                    vergiTutarlari = new decimal[10];
                    aratoplam = 0;
                    meblag = 0;

                    var detay = sonuc.Where(x => x.cari == c);
                    foreach (var h in detay)
                    {
                        aratoplam += h.tutar;
                        meblag += (h.tutar + h.kdvtutar);
                        vergiTutarlari[h.kdvsira] += Cevir.Parse<decimal>(h.kdvtutar);
                    }

                    CharId = mikro.CharEkle(EvrakTipleri.SatisFaturasi, trn, evrakSeri, evrakSira, dteBelgeTarihi.DateTime, Cevir.Parse<decimal>(meblag), vergiTutarlari, "", c, Cevir.Parse<decimal>(aratoplam), "", 0, "", 0, 0, 0, 0, c, Program.Session[Settings.WebSrmMerkezKodu].ToString(),0);

                    foreach (var h in detay)
                    {
                        mikro.SharEkle(EvrakTipleri.SatisFaturasi, trn, evrakSeri, evrakSira, dteBelgeTarihi.DateTime, evrakSatir, h.stok, h.cari, "", Cevir.Parse<decimal>(h.miktar), Cevir.Parse<decimal>(h.tutar), h.kdvsira, Cevir.Parse<decimal>(h.kdvtutar), CharId, depoNo, depoNo, 0, 0, 0, Program.Session[Settings.WebSrmMerkezKodu].ToString(), 0);
                        evrakSatir++;
                    }
                }

                FaturaSil(trn);

                try
                {
                    trn.Commit();
                    MessageBox.Show("İşlem Tamamlandı !");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    if (trn != null)
                    {
                        trn.Rollback();
                    }
                }
            }
        }
    }
}
